#include "test_byte.h"
#include "string.h"
#include "stdlib.h"

#include "esp_timer.h"
#include "esp_log.h"
#include "esp_sleep.h"

#include "driver/gpio.h"

#define MODEL_NAME "template"
//测试模板
// typedef struct {
//
// }user_template;


// tostring 方法 
static int lua_user_tostring(lua_State *L){
    lua_pushstring(L,"lua socket model");
    return 1;
}

// 执行 collectgarbage()函数会进行gc
static int lua_user_gc(lua_State *L){
    //user_template**timer=(user_template**)lua_touserdata(L,1);
    return 0;
}

static const luaL_Reg lua_user_func[] ={ 
    {"__tostring", lua_user_tostring}, 
    {"__gc", lua_user_gc}, 
	{NULL, NULL}
};


// Timer.create('time1',22,call)
static int lua_create_new(lua_State *L){
     //创建一个对象指针放到stack里，返回给Lua中使用，userdata的位置-1
    
    //user_template**temp = (user_template**)lua_newuserdata(L, sizeof(user_template*));
    //Lua->stack，得到全局元表位置-1,userdata位置-2
    luaL_getmetatable(L, MODEL_NAME);
    //将元表赋值给位置-2的userdata，并弹出-1的元表
    lua_setmetatable(L, -2);
    return 1;
}

static const luaL_Reg lua_user_constructor_funcs[] = {
    { "create", lua_create_new },
    { NULL, NULL }
};

int luaopen_user_template_libs (lua_State *L) {
     //创建全局元表（里面包含了对LUA_REGISTRYINDEX的操作），元表的位置为-1
    luaL_newmetatable(L, MODEL_NAME);

    //将元表作为一个副本压栈到位置-1，原元表位置-2
    lua_pushvalue(L, -1);

    //设置-2位置元表的__index索引的值为位置-1的元表，并弹出位置-1的元表，原元表的位置为-1
    lua_setfield(L, -2, "__index");

    //将成员函数注册到元表中（到这里，全局元表的设置就全部完成了）
    luaL_setfuncs(L, lua_user_func, 0);
    //注册构造函数到新表中，并返回给Lua
    luaL_newlib(L, lua_user_constructor_funcs);
    return 1;
}